Option Explicit

'################################################################
' Field
'################################################################
Private sheet As Worksheet

Private defineStartRow As Long
Private defineStartCol As Integer
Private defineEndRow As Long
Private defineEndCol As Integer

Private fieldTableId As String
Private filedColumnDefineMap As Object

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    Set filedColumnDefineMap = New SimpleMap
End Sub

Private Sub Class_Terminate()
    Set filedColumnDefineMap = Nothing
End Sub

'################################################################
' Property
'################################################################
' 获取表ID
Public Property Get TableId() As String
    TableId = fieldTableId
End Property

' 获取表定义内的所有列定义
' @return Map<String, DBTableColumnDefine>
Public Property Get ColumnDefineMap() As Object
    Set ColumnDefineMap = filedColumnDefineMap
End Property
'################################################################
' get Define
'################################################################
' 初始化
' 初始化时，会保存表定义所在的 sheet + 表定义所在的区域，可以用来复制
' @param sh 表定义所在的 sheet
' @param startRow 表定义所在的区域坐标，起始行号
' @param startCol 表定义所在的区域坐标，起始列号
' @param endRow 表定义所在的区域坐标，结束行号
' @param endCol 表定义所在的区域坐标，结束列号
' @param tableDefineStartColumn 表定义的开始列
' @param tableIdIndex 表ID在区域中的索引（从 1 开始）
' @param logicNameIndex 列逻辑名在区域中的索引（从 1 开始）
' @param physicalNameIndex 列物理名在区域中的索引（从 1 开始）
' @param columnTypeIndex 列类型在区域中的索引（从 1 开始）
' @param columnSizeIndex 列长度在区域中的索引（从 1 开始）
' @param isColumnPkIndex 主键在区域中的索引（从 1 开始）
' @param pkMark 主键标记。和主键标记相同的列才会被标记为主键
Public Sub Init( _
    ByRef sh As Worksheet, _
    ByRef startRow As Long, _
    ByRef startCol As Integer, _
    ByRef endRow As Long, _
    ByRef endCol As Integer, _
    ByRef tableDefineStartColumn As String, _
    ByRef tableIdIndex As Long, _
    ByRef logicNameIndex As Long, _
    ByRef physicalNameIndex As Long, _
    ByRef columnTypeIndex As Long, _
    ByRef columnSizeIndex As Long, _
    ByRef isColumnPkIndex As Long, _
    ByRef pkMark As String _
    )

    Set sheet = sh
    defineStartRow = startRow
    defineStartCol = startCol
    defineEndRow = endRow
    defineEndCol = endCol

    Dim tableDefineStartColumnNo As Long
    tableDefineStartColumnNo = UtilsWorksheet.colStr2No(tableDefineStartColumn)

    Dim realStartCol As Long
    If tableDefineStartColumnNo > defineStartCol Then
        realStartCol = tableDefineStartColumnNo
    Else
        realStartCol = defineStartCol
    End If

    With sheet
        ' 1. 设置 tableId
        fieldTableId = .Cells((defineStartRow + tableIdIndex - 1), realStartCol).Value

        ' 2. 创建列定义
        'Set filedColumnDefineMap = UtilsCreateSysObj.createMap

        Dim i As Integer
        Dim tempColumnDefine As DBTableColumnDefine
        Dim pkValue As String

        ' 2.1 遍历所有的列
        For i = realStartCol To defineEndCol
            Set tempColumnDefine = New DBTableColumnDefine

            If logicNameIndex >= 0 Then
                tempColumnDefine.LogicName = .Cells((defineStartRow + logicNameIndex - 1), i).Value
            End If

            If physicalNameIndex >= 0 Then
                tempColumnDefine.PhysicalName = .Cells((defineStartRow + physicalNameIndex - 1), i).Value
            End If

            If columnTypeIndex >= 0 Then
                tempColumnDefine.TypeName = .Cells((defineStartRow + columnTypeIndex - 1), i).Value
            Else
                tempColumnDefine.TypeName = ""
            End If

            If columnSizeIndex >= 0 Then
                tempColumnDefine.setMainSize .Cells((defineStartRow + columnSizeIndex - 1), i).Value
            Else
                tempColumnDefine.setMainSize "0"
            End If

            ' 设置主键
            ' 如果主键上的值为空，则默认设为 False
            ' 如果主键上的值和指定的主键标记 pkMark 相同，则设为 True；不相同，则设为 False
            If isColumnPkIndex >= 0 Then
                pkValue = .Cells((defineStartRow + isColumnPkIndex - 1), i).Value
                If pkValue = pkMark Then
                    tempColumnDefine.IsPk = True
                Else
                    tempColumnDefine.IsPk = False
                End If
            Else
                tempColumnDefine.IsPk = False
            End If

            ' 设置列定义所在的表定义
            tempColumnDefine.Parent = Me

            ' 2.2 将生成的列定义保存到当前表定义的缓存内
            filedColumnDefineMap.Add tempColumnDefine.Name, tempColumnDefine
        Next

    End With

End Sub

